﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Collections.ObjectModel;
using TES.EnteRegulador;
using AjaxControlToolkit;

namespace TES.WEB.EnteRegulador.Controles
{
    /// <summary>
    /// Control que tiene la vista del merge legalizacion
    /// </summary>
    public partial class ControlMergeLegalizacion : System.Web.UI.UserControl
    {

        private const string _ascending = "ASC";
        private const string _descending = "DESC";

        /// <summary>
        /// PageLoad de la pagina
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Seleccionable)
                GridViewControlMergeLegalizaciones.Columns[GridViewControlMergeLegalizaciones.Columns.Count - 1].Visible = false;
        }
        /// <summary>
        /// Indica si los enlaces son seleccionables
        /// </summary>
        public bool Seleccionable 
        {
            get { return bool.Parse(HiddenFieldSeleccionable.Value); }
            set { HiddenFieldSeleccionable.Value = value.ToString(); }
        }


        /// <summary>
        /// Direccion en la que se debe ordenar
        /// </summary>
        public SortDirection GridViewSortDirection
        {
            get
            {
                if (ViewState["sortDirection" + this.ID] == null)
                    ViewState["sortDirection" + this.ID] = SortDirection.Ascending;

                return (SortDirection)ViewState["sortDirection" + this.ID];
            }
            set { ViewState["sortDirection" + this.ID] = value; }
        }

        /// <summary>
        /// Evento que ocurre al hacxer el sort de la grilla
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void OnSort(object sender, GridViewSortEventArgs e)
        {
            string sortExpression = e.SortExpression;

            if (GridViewSortDirection == SortDirection.Ascending)
            {
                GridViewSortDirection = SortDirection.Descending;


                //    SortGridView(sortExpression, _descending);
                Session["SortDirecction" + this.ID] = _descending;
            }
            else
            {
                GridViewSortDirection = SortDirection.Ascending;
                //SortGridView(sortExpression, _ascending);
                Session["SortDirecction" + this.ID] = _ascending;
            }
            Session["SortExpression" + this.ID] = sortExpression;
            //   ObjectDataSource1.DataBind();
            this.DataBind();
            e.Cancel = true;


        }

        /// <summary>
        /// Ordena el GridView 
        /// </summary>
        /// <param name="sortExpression">Campo a ordenar</param>
        /// <param name="direction">Direccion en la que se debe ordenar</param>
        /// <param name="lista">lista a ordenar</param>
        /// <returns>Lista ordenada segun el parametro y la direccion</returns>
        private static List<MergeRedVisual> SortGridView(string sortExpression, string direction, List<MergeRedVisual> lista)
        {
            if (!string.IsNullOrEmpty(sortExpression))
            {
                ComparadorMergeRedVisual comparador = new ComparadorMergeRedVisual(sortExpression);
                lista.Sort(comparador);

            }

            //Now that we have sorted check to see if the sort direction is desc
            if (!string.IsNullOrEmpty(direction) && direction == "DESC")
            {
                lista.Reverse();
            }


            return lista;
        }

        /// <summary>
        /// Filtra la lista
        /// </summary>
        /// <param name="filtrarRed">Filtro del numero de red</param>
        /// <param name="filtrarRegional">Filtro de la regional</param>
        /// <param name="filtrarEnlace">Filtro del nombre del enlace</param>
        /// <param name="filtrarEstadoEnlace">Filtro del estado del enlace</param>
        /// <param name="filtrarEstadoLegalizacion">Filtro del estado de la legalizacion</param>
        /// <param name="filtrarCompleto">Filtro por completo</param>
        /// <param name="filtrarImplementado">Filtro por enlace implementado</param>
        /// <param name="lista">lista a filtrar</param>
        /// <returns>Retorna la lista filtrada</returns>
        private static List<MergeRedVisual> FiltrarLista(string filtrarRed, string filtrarRegional, string filtrarEnlace, string filtrarEstadoEnlace, string filtrarEstadoLegalizacion, string filtrarCompleto, string filtrarImplementado, List<MergeRedVisual> lista)
        {

            List<MergeRedVisual> lista2 = new List<MergeRedVisual>();
            lista2 = lista;

            if (!string.IsNullOrEmpty(filtrarRed))
            {
                int valor = int.Parse(filtrarRed);
                var response = from s in lista2
                               where s.NumeroRed.HasValue && s.NumeroRed.Value == valor
                               select s;
                lista2 = response.Cast<MergeRedVisual>().ToList();
            }

            if (!string.IsNullOrEmpty(filtrarRegional))
            {
                var response1 = from s in lista2
                                where s.NombreCodigoExpediente != null && s.NombreCodigoExpediente.ToLower().Contains(filtrarRegional.ToLower())
                                select s;
                lista2 = response1.Cast<MergeRedVisual>().ToList();
            }
            if (!string.IsNullOrEmpty(filtrarEnlace))
            {
                var response2 = from s in lista2
                                where s.NombreEnlace.ToLower().Contains(filtrarEnlace.ToLower())
                                select s;
                lista2 = response2.Cast<MergeRedVisual>().ToList();
            }
            if (!string.IsNullOrEmpty(filtrarEstadoEnlace))
            {
                var response4 = from s in lista2
                                where s.Estado.ToLower().Contains(filtrarEstadoEnlace.ToLower())
                                select s;
                lista2 = response4.Cast<MergeRedVisual>().ToList();
            }
            if (!string.IsNullOrEmpty(filtrarEstadoLegalizacion))
            {
                var response3 = from s in lista2
                                where s.DescEstadoLegalizacionEnlace.ToLower().Contains(filtrarEstadoLegalizacion.ToLower())
                                select s;
                lista2 = response3.Cast<MergeRedVisual>().ToList();
            }
            if (!string.IsNullOrEmpty(filtrarCompleto))
            {

                var response3 = from s in lista2
                                where s.DatosCompletos == filtrarCompleto
                                select s;
                lista2 = response3.Cast<MergeRedVisual>().ToList();
            }
            if (!string.IsNullOrEmpty(filtrarImplementado))
            {

                var response3 = from s in lista2
                                where s.EstaImplementado.ToLower() == filtrarImplementado.ToLower()
                                select s;
                lista2 = response3.Cast<MergeRedVisual>().ToList();
            }


            return lista2;
        }


        /// <summary>
        /// Override del dataBind del control
        /// </summary>
        public override void DataBind()
        {
            GridViewControlMergeLegalizaciones.DataSource = DataSet;
            GridViewControlMergeLegalizaciones.DataBind();
            if (!Seleccionable)
                GridViewControlMergeLegalizaciones.Columns[GridViewControlMergeLegalizaciones.Columns.Count - 1].Visible = false;
            LabelNumeroPaginasVistas.Text = "Página " + (GridViewControlMergeLegalizaciones.PageIndex + 1).ToString() + " de " + GridViewControlMergeLegalizaciones.PageCount.ToString();
            UpdatePanelControlMergeLegalizacion.Update();
        }

        /// <summary>
        /// Id del popup extender
        /// </summary>
        public string IdPopUp
        {
            get { return Session["IdPopUp"+this.ID].ToString(); }
            set { Session["IdPopUp" + this.ID] = value; }
        }
        /// <summary>
        /// Id del control que muestra los detalles del control
        /// </summary>
        public string IdControlDetalles
        {
            get { return Session["IdControlDetalles" + this.ID].ToString(); }
            set { Session["IdControlDetalles" + this.ID] = value; }
        }

        /// <summary>
        /// DataSource de BD
        /// </summary>
        public ReadOnlyCollection<TES.EnteRegulador.MergeEnlace> DataSource
        {
            set { Session["DataSourceMerge" + this.ID] = value; }
            get { return (Session["DataSourceMerge" + this.ID] != null) ? (ReadOnlyCollection<TES.EnteRegulador.MergeEnlace>)(Session["DataSourceMerge" + this.ID]) : null; }
        }

        /// <summary>
        /// DataSet del GridView
        /// </summary>
        private List<MergeRedVisual> DataSet
        {
            get { return ObtenerDataSet(); }
        }

        /// <summary>
        /// Obtiene el data set
        /// </summary>
        /// <returns></returns>
        private List<MergeRedVisual> ObtenerDataSet()
        {
            if (DataSource != null)
            {
                ReadOnlyCollection<TES.EnteRegulador.MergeRed> listadoRedes = TES.EnteRegulador.FotoDatosMinisterio.CrearListaMergesRed(DataSource);

                List<MergeRedVisual> listaMerges = new List<MergeRedVisual>();

                // List<Guid> idsMerges = new List<Guid>();
                if (listadoRedes != null)
                {
                    foreach (MergeRed mergeRed in listadoRedes)
                    {

                        listaMerges.Add(new MergeRedVisual(mergeRed, false));
                    }
                    //ActualizarBindingSource(listaMerges);
                }

                string expresion = (Session["SortExpression" + this.ID] != null) ? Session["SortExpression" + this.ID].ToString() : string.Empty;
                string direccion = (Session["SortDirecction" + this.ID] != null) ? Session["SortDirecction" + this.ID].ToString() : string.Empty;

                listaMerges = SortGridView(expresion, direccion, listaMerges);



                string filtrarRed = (Session["FiltrarRed" + this.ID] != null) ? Session["FiltrarRed" + this.ID].ToString() : string.Empty;
                string filtrarRegional = (Session["FiltrarRegional" + this.ID] != null) ? Session["FiltrarRegional" + this.ID].ToString() : string.Empty;
                string filtrarEnlace = (Session["FiltrarEnlace" + this.ID] != null) ? Session["FiltrarEnlace" + this.ID].ToString() : string.Empty;
                string filtrarEstadoEnlace = (Session["FiltrarEstadoEnlace" + this.ID] != null) ? Session["FiltrarEstadoEnlace" + this.ID].ToString() : string.Empty;
                string filtrarEstadoLegalizacion = (Session["FiltrarEstadoLegalizacion" + this.ID] != null) ? Session["FiltrarEstadoLegalizacion" + this.ID].ToString() : string.Empty;
                string filtrarCompleto = (Session["FiltrarCompleto" + this.ID] != null) ? Session["FiltrarCompleto" + this.ID].ToString() : string.Empty;
                string filtarImplementado = (Session["FiltrarImplementado" + this.ID] != null) ? Session["FiltrarImplementado" + this.ID].ToString() : string.Empty;

                listaMerges = FiltrarLista(filtrarRed, filtrarRegional, filtrarEnlace, filtrarEstadoEnlace, filtrarEstadoLegalizacion, filtrarCompleto, filtarImplementado, listaMerges);
                return listaMerges;
            }
            else
            {
                return null;
            }
        }






        /// <summary>
        /// Ocurre cuando se da click en el boton filtrar
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnFiltrar_Click(object sender, EventArgs e)
        {
            if (_checkBoxFiltrarPorNumeroRed.Checked == true)
            {
                Session["FiltrarRed" + this.ID] = txtFiltrarRed.Text.ToString();
            }
            else
            {
                Session["FiltrarRed" + this.ID] = null;
            }

            if (_checkBoxFiltrarPorRegional.Checked == true)
            {
                Session["FiltrarRegional" + this.ID] = txtFiltrarRegional.Text.ToString();
            }
            else
            {
                Session["FiltrarRegional" + this.ID] = string.Empty;
            }
            if (_checkBoxFiltrarPorEnlace.Checked == true)
            {
                Session["FiltrarEnlace" + this.ID] = txtFiltrarPorEnlace.Text.ToString();
            }
            else
            {
                Session["FiltrarEnlace" + this.ID] = string.Empty;
            }

            if (_checkBoxFiltrarPorEstadoEnlace.Checked == true)
            {
                Session["FiltrarEstadoEnlace" + this.ID] = txtFiltrarPorEstadoEnlace.Text.ToString();
            }
            else
            {
                Session["FiltrarEstadoEnlace" + this.ID] = string.Empty;
            }

            if (_checkBoxFiltrarPorEstadoLegalizacion.Checked == true)
            {
                Session["FiltrarEstadoLegalizacion" + this.ID] = txtFiltrarPorEstadoLegalizacion.Text.ToString();
            }
            else
            {
                Session["FiltrarEstadoLegalizacion" + this.ID] = string.Empty;
            }
            if (_checkBoxFiltrarPorCompleto.Checked == true)
            {
                Session["FiltrarCompleto" + this.ID] = dropListFiltrarPorCompleto.SelectedItem.ToString();
            }
            else
            {
                Session["FiltrarCompleto" + this.ID] = string.Empty;
            }
            if (_checkBoxFiltrarPorImplementado.Checked == true)
            {
                Session["FiltrarImplementado" + this.ID] = dropListFiltrarPorImplementado.SelectedItem.ToString();
            }
            else
            {
                Session["FiltrarImplementado" + this.ID] = string.Empty;
            }
            this.DataBind();
        }

        /// <summary>
        /// Manejo de la paginación de la grilla
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void GridViewControlMergeLegalizaciones_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            GridViewControlMergeLegalizaciones.PageIndex = e.NewPageIndex;

            this.DataBind();
            e.Cancel = true;
        }
        /// <summary>
        /// Manejo del selected index del numero de items por pagina
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void DropDownListNumeroPaginas_SelectedIndexChanged(object sender, EventArgs e)
        {
            GridViewControlMergeLegalizaciones.PageSize = int.Parse(DropDownListNumeroPaginas.SelectedValue);
            GridViewControlMergeLegalizaciones.PageIndex = 0;
            this.DataBind();
        }
        /// <summary>
        /// Manejador de los comandos de los items del gridview
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void GridViewControlMergeLegalizaciones_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            if (e.CommandName == "DetallesLegalizacion")
            {
              AjaxControlToolkit.ModalPopupExtender mpe =   FindControlRecursive(this.Page, IdPopUp) as ModalPopupExtender;
              ControlDetallesEnlace cde = FindControlRecursive(this.Page, IdControlDetalles) as ControlDetallesEnlace;
              int index = 0;
              if (int.TryParse(e.CommandArgument.ToString(), out index) && cde != null)
              {
                  cde.DataSource = DataSet[index].MergeRed.ListaMerges;
                  cde.DataBind();  
              }
                
                //regActual.MergeRed.ListaMerges
                
                mpe.Show();
            }
        }

           /// <summary>
        /// Finds a control by recursively searching containing controls
        /// </summary>
        /// <param name="root">Top-level control that contains controls</param>
        /// <param name="id">ID of the control to find</param>
        /// <returns>Control matching the ID</returns>
        public static Control FindControlRecursive(Control root, string id)
        {
            if (root.ID == id)
            {
                return root;
            }

            foreach (Control c in root.Controls)
            {
                Control t = FindControlRecursive(c, id);
                if (t != null)
                {
                    return t;
                }
            }

            return null;
        }
      





    }
}